承昨天的話題,今天來把剩下的引數帶入方式介紹完。
variable-length argument list
,也就是長度可變的引數組,用來帶入任意數量(從0到無窮大),有 single splat
和 double splat
兩種。在參數前加上 * 符號,而引數帶入的方式是把引數們放進一個陣列裡:
def testArgs(arg_1, *more)
more
end
testArgs(1, "apple", [1, 2, 3], key: :value)
# 印出 ["apple", [1, 2, 3], {:key=>:value}]
既然是放進陣列,那理所當然可以用陣列的方法加以應用:
def say_hello(my_name, *others_names)
others_names.each {|name| puts "Hi, I'm #{my_name}. Greeting to you, #{name}!!"}
end
say_hello("Karen", "Thor", "Stark", "Morgan", "Happy", "Parker")
# 印出以下內容
# Hi, I'm Karen. Greeting to you, Thor!!
# Hi, I'm Karen. Greeting to you, Stark!!
# Hi, I'm Karen. Greeting to you, Morgan!!
# Hi, I'm Karen. Greeting to you, Happy!!
# Hi, I'm Karen. Greeting to you, Parker!!
可以發現這樣一個簡易的打招呼系統,未來如果有添加新的客人要也不須更動程式碼結構。
在參數前加上 ** 符號,可以用來搭配 keyword argument ,可以想像引數們是被傳進 Hash 中。
def testArgs(arg_1, *more, **rest)
p arg_1, more, rest
end
testArgs(1, 2, 3, 4, 5, a: 1, b: 2, c: 3)
# 印出 1 [2, 3, 4, 5] {:a=>1, :b=>2, :c=>3}
我們來試試各種引數亂入:
def args_fightting(a, b = 42, *c, **d)
[a, b, c, d]
end
args_fightting(1) # 得到 [1, 42, [], {}]
# 可以發現 Standard Argument 的優先度最高
args_fightting(1, 2, 3, 4) # 得到 [1, 2, [3, 4], {}]
# 滿足 Standard Argument 後,有多餘的會先分給 Optional Argument
# 不是 Keyword Argument 的引數都會被放進 single splat
args_fightting(1, 2, 3, d: 4, e: 5) # 得到 [1, 2, [3], {:d=>4, :e=>5}]
# Keyword Argument 的引數會被放進 double plat
args_fightting(c: 3, d: 4) # 得到 [{:c=>3, :d=>4}, 42, [], {}]
# 有種 Keyword Argument 被搶走的感覺,但其實是被判定成一個省略花括號 {} 的 hash 作為Standard Argument
以上程式碼中,有兩個重點:
一個
省略花括號 hash ,就會被 standard 抓走。class Breakfast
def nutrition(vitamins, minerals)
puts vitamins
puts minerals
end
end
class Bacon < Breakfast
def nutrition(*)
super
puts "I also make you fat"
end
end
bacon = Bacon.new
bacon.nutrition("B6", "iron")
# 印出以下內容
# B6
# iron
# I also make you fat
這裡有個看起來有點酷的字眼 super
,我們明天來分享吧!
此文同步刊登於CJ-Han的網站